home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / c / xw2.000 / xw2 / xw / csource / xbwscanner.yy < prev    next >
Encoding:
Text File  |  1995-02-02  |  7.0 KB  |  348 lines

  1.  
  2. /* DEFINITIONS */
  3. /*{{{  states*/
  4. %x endoffile
  5.  
  6. %{
  7. #define MAX_INCLUDE_DEPTH 50
  8. YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
  9. int include_stack_ptr = 0;
  10. %}
  11.  
  12. /*}}}  */
  13. /*{{{  global includes and variables*/
  14.  
  15. %{
  16. #include <math.h>
  17. #include <string.h>
  18. #include "xbw.h"
  19. #include "xbwtype.h"
  20. /*{{{F xbwtype.h*/
  21. /*:::F xbwtype.h*/
  22. /*}}}  */
  23.  
  24. int command_state = 0;
  25. int debug = 1;
  26. int parameter_state = 0;
  27. int bracket_open = 0;
  28. int error_count = 0;
  29. int warning_count = 0;
  30. char command_name[200]="ERROR";
  31.  
  32.  
  33. int SCAN_level=0;
  34.  
  35. #undef YY_INPUT
  36. #define YY_INPUT(buf,result,max_size) \
  37.           if (feof(yyin)){\
  38.             buf[0]=EOF;\
  39.             result=0;\
  40.             }\
  41.           else {\
  42.             if((result=read(fileno(yyin), (char*)buf, max_size )) < 0){\
  43.               buf[0]=EOF;\
  44.               result=0;\
  45.               };\
  46.             };\
  47.  
  48.  
  49. %}
  50. /*}}}  */
  51.  
  52. /* PATTERNS */
  53.  
  54. INTEGER           [0-9][0-9]*
  55. CSTRING           [(]["]([A-Za-z0-9@ <>|,._:;!'$%&/()=?*'#+]|"-"|"["|"]")*["][)]
  56. NSTRING           ["]["]|["][ ]["]
  57. DSTRING           [ ][.]
  58. USTRING           [A-Za-z][A-Za-z0-9@/\\]*
  59. NULLPTR           [(]ptr[)]NULL
  60. NPTRSTRING        [(]ptr[)][A-Z]{3}
  61. SPTRSTRING        [(]str[)][A-Z]{3}
  62. IPTRSTRING        [(]int[)][A-Z]{3}
  63. DPTRSTRING        [(]dbl[)][A-Z]{3}
  64. DOUBLE            (([0-9])+)[.](([0-9])+)([Ee0-9]|"-"|"+")?
  65.  
  66. COMMENT           "%".*
  67.  
  68. NUMVARNAME        [#][A-Za-z][A-Za-z0-9]*
  69. STRVARNAME        [$][A-Za-z][A-Za-z0-9]*
  70. NUMPARNAME        [#][0-9][0-9]*
  71. STRPARNAME        [$][0-9][0-9]*
  72.  
  73. %%
  74.             /* RULES */
  75. [{] {
  76.   /*{{{  */
  77.   if (!IFTHEN_val){
  78.     SCAN_level++;
  79.     };
  80.   /*}}}  */
  81.   }
  82. [}] {
  83.   /*{{{  */
  84.   if (SCAN_level){
  85.     SCAN_level--;
  86.     };
  87.   if (SCAN_level==0){
  88.     IFTHEN_val=1;
  89.     };
  90.   /*}}}  */
  91.   }
  92. if {
  93.   /*{{{  */
  94.   puts("\nIf command ");
  95.   if(!SCAN_level){return(put_lval_if());};
  96.   /*}}}  */
  97.   }
  98. then {
  99.   /*{{{  */
  100.   puts("\nThen command ");
  101.   if (!SCAN_level){return(put_lval_then());};
  102.   /*}}}  */
  103.   }
  104. {DOUBLE}+ {
  105.   /*{{{  */
  106.   { double dd;
  107.     char sstr[99];
  108.     int ii;
  109.     for (ii=0;ii<98;ii++){
  110.       sstr[ii]=yytext[ii];
  111.       switch(sstr[ii]){
  112.         case 0:
  113.         case 13:
  114.         case 10:
  115.         case ' ':
  116.         case ')':
  117.         case ';':
  118.         case '}':
  119.           sstr[ii]=0;
  120.           ii=99;
  121.           break;
  122.         default:
  123.           break;
  124.         };
  125.       };
  126.     dd = atof(sstr);
  127.     if(!SCAN_level){return(put_lval_double(dd));};
  128.     };
  129.   /*}}}  */
  130.   }
  131. {INTEGER}+ {
  132.   /*{{{  */
  133.   { double dd;
  134.     dd = (double)atoi(yytext);
  135.     if (!SCAN_level){return(put_lval_double(dd)); };
  136.     };
  137.   /*}}}  */
  138.   }
  139. {NULLPTR}+ {
  140.   /*{{{  */
  141.   if(!SCAN_level){return(put_lval_nullptr());};
  142.   /*}}}  */
  143.   }
  144. {CSTRING}+ {
  145.   /*{{{  */
  146.   {
  147.     char sstr[200];
  148.     char *ppos;
  149.     int ii;
  150.     strcpy(sstr,(char*)&yytext[2]);
  151.     if ((ppos=strstr(sstr,"\")"))!=NULL){
  152.       *ppos=0;
  153.       };
  154.     for (ii=0;ii<199;ii++){
  155.       if (sstr[ii]=='\''){ sstr[ii]='\"'; };
  156.       if (!sstr[ii]){ break; };
  157.       };
  158.     if(!SCAN_level){return(put_lval_string(sstr));};
  159.     };
  160.   /*}}}  */
  161.   }
  162. {NSTRING}+ {
  163.   /*{{{  */
  164.   {
  165.     char sstr[200];
  166.     strncpy(sstr,(char*)&yytext[1],3);
  167.     sstr[1]=0;
  168.     if (sstr[0]=='"'){ sstr[1]=0;};
  169.     if(!SCAN_level){return(put_lval_string(sstr));};
  170.     };
  171.   /*}}}  */
  172.   }
  173. {USTRING}+ {
  174.   /*{{{  */
  175.   if(put_lval_isvar(yytext)){
  176.     if (!SCAN_level){return(put_lval_var(yytext));};
  177.     }
  178.   else {
  179.     if(!SCAN_level){
  180.       char sstr[200];
  181.       int ii;
  182.       strncpy(sstr,yytext,199);
  183.       for (ii=0;ii<199;ii++){ if (yytext[ii]==' '){sstr[ii]=0;break; };};
  184.       return(put_lval_string(sstr));
  185.       };
  186.     };
  187.   /*}}}  */
  188.   }
  189. {NPTRSTRING}+|{SPTRSTRING}+|{IPTRSTRING}+|{DPTRSTRING}+ {
  190.   /*{{{  */
  191.   if (!SCAN_level){
  192.     char sstr[10];
  193.     char *pstr;
  194.     strncpy(sstr,(char*)&yytext[5],9);
  195.     sstr[9]=0;
  196.     if ((pstr=strchr(sstr,':')) != NULL){
  197.       *pstr=0;
  198.       };
  199.     return(put_lval_pointer(yytext[1],sstr));
  200.     };
  201.   /*}}}  */
  202.   }
  203. {DSTRING}+ {
  204.   /*{{{  */
  205.   if(!SCAN_level){return(put_lval_string("."));};
  206.   /*}}}  */
  207.   }
  208. {NUMVARNAME}+ {
  209.   /*{{{  */
  210.   if(!SCAN_level){return(put_lval_numvar((char*)&yytext[1]));};
  211.   /*}}}  */
  212.   }
  213. {STRVARNAME}+ {
  214.   /*{{{  */
  215.   if (!SCAN_level){return(put_lval_strvar((char*)&yytext[1]));};
  216.   /*}}}  */
  217.   }
  218. {NUMPARNAME}+ {
  219.   /*{{{  */
  220.   if(!SCAN_level){return(put_lval_num_macropar(atoi((char*)&yytext[1])));};
  221.   /*}}}  */
  222.   }
  223. {STRPARNAME}+ {
  224.   /*{{{  */
  225.   if(!SCAN_level){return(put_lval_str_macropar(atoi((char*)&yytext[1])));};
  226.   /*}}}  */
  227.   }
  228. End[(][)]; {
  229.   /*{{{  */
  230.   if(!SCAN_level){return(put_lval_end_command());};
  231.   /*}}}  */
  232.   }
  233. {COMMENT}+
  234. (" "|[\t\n])+
  235. "/*"        { register int c;
  236.               for (;;){
  237.                 while(( (c=input()) !=  '*') && c != EOF)
  238.                   ;
  239.                 if (c=='*'){
  240.                   while( (c=input())== '*')
  241.                     ;
  242.                   if (c=='/') break;
  243.                   }
  244.                 if (c==EOF){
  245.                   fprintf(stderr,"ERROR: EOF %s in comment!\n",command_name);
  246.                   error_count++;
  247.                   break;
  248.                   }
  249.                 }
  250.               }
  251.  
  252.  
  253. <<EOF>> {
  254.   /*{{{  */
  255.   return(0);
  256.   /*}}}  */
  257.   }
  258.  
  259. . {
  260.   if(!SCAN_level){return(yytext[0]);};
  261.   }
  262.  
  263. %%
  264. /* USER CODE */
  265.  
  266.  
  267. int begin_include(char *macro){
  268.   /*{{{  */
  269.   strcpy(command_name,macro);
  270.   if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )  {
  271.     fprintf( stderr, "Includes nested too deeply" );
  272.     return(0);
  273.     }
  274.   
  275.   include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
  276.   /*{{{  */
  277.   {
  278.     int ii;
  279.     char sstr[200];
  280.     for (ii=0;ii<strlen(command_name);ii++){
  281.       if (command_name[ii]=='\\'){ command_name[ii]='/'; };
  282.       };
  283.     if (command_name[0]=='@'){
  284.       strcpy(command_name,(char *)&command_name[1]);
  285.       };
  286.     yyin = fopen(command_name, "r" );
  287.     if (yyin==NULL){
  288.       sprintf(sstr,"%s.mta",command_name);
  289.       yyin = fopen( sstr, "r" );
  290.       if (yyin==NULL){
  291.         sprintf(sstr,"/xw/x/%s.mta",command_name);
  292.         yyin = fopen( sstr, "r" );
  293.         if (yyin==NULL){
  294.           fprintf(stderr,"ERROR: cannot open file %s !\n",command_name);
  295.           error_count++;
  296.           return(0);
  297.           };
  298.         };
  299.       };
  300.     };
  301.   /*}}}  */
  302.   
  303.   yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) );
  304.   printf("\nExec macro file: %s ... ",macro);
  305.   return(1);
  306.   /*}}}  */
  307.   };
  308.  
  309. int end_include(void){
  310.   /*{{{  */
  311.   if (--include_stack_ptr < 0 ){
  312.     /* yyterminate(); */
  313.     return(EOF);
  314.     }
  315.   else {
  316.     if (yyin  != NULL){
  317.       if (yyin != stdin){fclose(yyin);};
  318.       yy_switch_to_buffer( include_stack[include_stack_ptr] );
  319.       };
  320.     };
  321.   printf(" done.");
  322.   return(EOF);
  323.   /*}}}  */
  324.   };
  325.  
  326. int begin_macro(char *macro){
  327.   /*{{{  */
  328.   YY_BUFFER_STATE buffer;
  329.   
  330.   include_stack_ptr=0;
  331.   buffer= yy_create_buffer( yyin, YY_BUF_SIZE );
  332.   
  333.   yy_switch_to_buffer(buffer);
  334.   
  335.   sprintf(buffer->yy_ch_buf,"%s End();",macro);
  336.   yy_current_buffer->yy_n_chars = strlen(buffer->yy_ch_buf);
  337.   yy_current_buffer->yy_buf_pos = buffer->yy_ch_buf;
  338.   yy_load_buffer_state();
  339.   buffer->yy_eof_status = EOF_PENDING;
  340.   yy_did_buffer_switch_on_eof = 1;
  341.   printf("\nExec object action: %s ... ",macro);
  342.   buffer->yy_input_file=yyin=NULL;
  343.   return(1);
  344.   /*}}}  */
  345.   };
  346.  
  347.  
  348.